﻿using System;
using System.Data;

namespace DBConnect
{
    public class CommandLotes
    {
        /// <summary>
        /// Busca loteGuias da Operadora que já foram enviados
        /// </summary>
        /// <param name="codPrestador"></param>
        /// <param name="regANS"></param>
        /// <param name="tipoGuia"></param>
        /// <returns></returns>
        public static DataTable selecionaLoteGuiasEnviados(long codPrestador, string regANS, int tipoGuia, int tipoSolicCod)
        {
            

            string query = "SELECT a.ID, a.numeroLote, a.sequencialTransacao AS sequencialTransacaoLote, c.SequencialTransacao AS sequencialTransacaoDemonstrativo, " +
                                    "a.protocoloRecebimento, a.tipoGuia, b.demonstrativoCod, c.tipoSolic_Cod " +
                "FROM ((LoteGuias a " +
                "LEFT OUTER JOIN (SELECT loteID, MAX(demonstrativoCod) AS demonstrativoCod " +
                                    "FROM DemonstrativoRetorno WHERE (tipoSolic_Cod = " + tipoSolicCod + ") " +
                                    "GROUP BY loteID) b ON b.loteID = a.ID) " +
                "LEFT OUTER JOIN DemonstrativoRetorno c ON c.demonstrativoCod = b.demonstrativoCod) " +
                "WHERE (a.codPrestador = " + codPrestador + ") AND " +
                        "(a.regANS = '" + regANS + "') AND " +
                        "(a.tipoGuia  = " + tipoGuia + ") AND " +
                        "(a.sequencialTransacao IS NOT NULL)";

            return Connect.seleciona(query).Tables[0];
        }

        /// <summary>
        /// Busca loteGuias da Operadora com a qual o Prestador Trabalha
        /// </summary>
        /// <param name="codPrestador">Código do Prestador</param>
        /// <param name="regANS">regANS da Operadora</param>
        /// <returns>numeroLote, tipoGuia, sequencialTransação, ID</returns>
        public static DataTable buscaLoteGuias(Int64 codPrestador, string regANS)
        {
            
            string query = "SELECT numeroLote, sequencialTransacao, ID, protocoloRecebimento, tipoGuia " +
                 "FROM LoteGuias " +
                 "WHERE  codPrestador = " + codPrestador + " AND regANS = '" + regANS + "'";
            return Connect.seleciona(query).Tables[0];
        }

        /// <summary>
        /// Busca Lote de Guias do Tipo escolhido
        /// </summary>
        /// <param name="codPrestador">ID do Prestador</param>
        /// <param name="regANS">regANS da Operadora</param>
        /// <param name="tipoGuia">Tipo do Lote</param>
        /// <returns>Tabela com os Lotes do Tipo escolhido</returns>
        public static DataTable buscaLoteGuiasTipo(Int64 codPrestador, string regANS, TipoGuia tipoGuia)
        {
            
            string query = "SELECT numeroLote, sequencialTransacao, ID, protocoloRecebimento " +
                 "FROM LoteGuias " +
                 "WHERE  codPrestador = " + codPrestador + " AND regANS = '" + regANS +
                 "' AND tipoGuia = " + (int)tipoGuia;
            return Connect.seleciona(query).Tables[0];
        }

        /// <summary>
        /// Busca Lote de Guias pelo número do Protocolo
        /// </summary>
        /// <param name="codPrestador">ID do Prestador</param>
        /// <param name="regANS">regANS da Operadora</param>
        /// <param name="numeroProtocolo">Numero Protocolo do Lote</param>
        /// <returns>Tabela com os Lotes do Protocolo escolhido</returns>
        public static DataRow buscaLoteGuiasProtocolo(Int64 codPrestador, string regANS, string numeroProtocolo)
        {
            
            string query = "SELECT LoteGuias.numeroLote, LoteGuias.sequencialTransacao, LoteGuias.ID, " +
                 "LoteGuias.protocoloRecebimento, LoteGuias.codStatusRecebimento, Mensagem.dataTransacao " +
                 "FROM (LoteGuias INNER JOIN Mensagem ON LoteGuias.sequencialTransacao = Mensagem.sequencialTransacao)" +
                 "WHERE  LoteGuias.codPrestador = " + codPrestador + " AND LoteGuias.regANS = '" + regANS +
                 "' AND LoteGuias.protocoloRecebimento = '" + numeroProtocolo + "'";
            return Connect.seleciona(query).Tables[0].Rows[0];
        }

        /// <summary>
        /// Cria um Lote de Guias
        /// </summary>
        /// <param name="tipoGuia">tipo de Guias do Lote</param>
        /// <param name="regANS">regANS da operadora destino do Lote</param>
        /// <param name="codPrestador">Identificação do Prestador origem do Lote</param>
        public static string[] criaLoteGuia(TipoGuia tipoGuia, string regANS, long codPrestador)
        {
            
            string queryNumLote = "SELECT IntervaloLote.Atual, IntervaloLote.ID , IntervaloLote.Ate " +
                                   "FROM (IntervaloLote INNER JOIN Trabalha ON IntervaloLote.IDTrabalha = Trabalha.ID) " +
                                   "WHERE Trabalha.codPrestador = " + codPrestador + " AND Trabalha.regANS = '" + regANS + "' " +
                                   "ORDER BY IntervaloLote.ID";
            DataTable dt = Connect.seleciona(queryNumLote).Tables[0];
            string[] dados = { "0", "0" };
            string IDTrabalha = "";
            foreach (DataRow auxdr in dt.Rows)
            {
                if ((Convert.ToInt64(auxdr.ItemArray[2].ToString())) >= (Convert.ToInt64(auxdr.ItemArray[0].ToString()) + 1))
                {
                    dados[0] = auxdr["Atual"].ToString();
                    IDTrabalha = auxdr["ID"].ToString();
                    break;
                }
            }
            if (IDTrabalha != "")
            {
                string query = "INSERT INTO LoteGuias(numeroLote,codStatusRecebimento, tipoGuia, regANS, codPrestador) " +
                               "VALUES('" + dados[0] + "',8, " + (int)tipoGuia + ", '" + regANS + "', " + codPrestador + ")";
                dados[1] = Connect.executa(query, "SELECT MAX(ID) FROM LoteGuias");
                queryNumLote = "UPDATE IntervaloLote SET Atual = '" + (Convert.ToInt64(dados[0]) + 1).ToString() + "' " +
                               "WHERE ID = " + Convert.ToInt64(IDTrabalha);
                Connect.executa(queryNumLote, "");
            }
            else
            {
                dados[0] = "-1";
                dados[1] = "-1";
            }
            return dados;
        }

        public static void updateSequencialTransacaoLoteGuias(long loteID, long sequencialTransacao, string protocoloRecebimento, int statusCod)
        {
            string query = "UPDATE LoteGuias " +
                "SET sequencialTransacao = " + sequencialTransacao + ", protocoloRecebimento ='" + protocoloRecebimento + "', codStatusRecebimento ='" + statusCod + "' " +
                "WHERE ID=" + loteID;
            
            Connect.executa(query, "");
        }


        /*
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static DataSet loteGuias()
        {
            string query = "SELECT  Operadora.regANS, Operadora.nome AS nomeOperadora, LoteGuias.protocoloRecebimento,Prestador.ID, Prestador.nome AS nomePrestador " +
                "LoteGuias.numeroLote, LoteGuias.sequencialTransacao, guia.[local], guia.numeroGuia, tipoGuia.tipoGuia, guia.enviada, guia.cancelada " +
                "FROM ((((((LoteGuias " +
                "INNER JOIN Mensagem ON LoteGuias.sequencialTransacao = Mensagem.sequencialTransacao) " +
                "INNER JOIN Prestador ON Mensagem.origem = Prestador.ID) " +
                "INNER JOIN lote ON LoteGuias.sequencialTransacao = lote.sequencialTransacao) " +
                "INNER JOIN guia ON lote.numeroGuia = guia.numeroGuia) " +
                "INNER JOIN tipoGuia ON guia.tipoGuiaCod = tipoGuia.tipoGuiaCod) " +
                "INNER JOIN Operadora ON Mensagem.destino = Operadora.regANS)" +
                "ORDER BY Operadora.regANS, tipoGuia.tipoGuiaCod, LoteGuias.sequencialTransacao DESC";
            DataSet ds = new DataSet();
            

            ds = Connect.seleciona(query);
            return ds;
        }*/
    }
}
